package com.tedu.review.oop;

/**
 * 抽象类:抽象类与抽象方法 关键字:abstract
 * 类:只能提供行为概念,没有具体实现行为
 *
 * 抽象类与面向对象--多态绝对关系[向上造型创建抽象对象]
 * 使用多态创建抽象类对象,抽象类本身无法创建对象,需要使用多态来完成抽象类创建
 *
 * 什么时候使用抽象类?
 * 复杂项目时,需要在不同的类下实现不同的轨迹
 *
 * 定义抽象类与抽象方法?
 * 抽象类:修饰符abstract class 类名{} ---毫无意义 ,必须结合抽象方法
 * 抽象方法:修饰符 abstract 返回值 方法(参数); 没有具体的实现
 *
 * 抽象类"实例化:创建对象",抽象类自身无法实例化
 * ①创建[N个]子类,继承抽象父类,子类一定实现抽象父类的所有抽象方法
 * ②使用面向对象:多态向上造型注意:抽象类一定发生重写,子类继承抽象,也可以
 */
abstract  class Animals{//抽象类
    //抽象方法:没有具体的实现[代码块]---一定继承--一定多态性[造型]
    public abstract void say();
    //①定义由final修饰的抽象方法?
    //public  final abstract void sleep();
    //②定义抽象变量
    //③定义静态变量
    static int i = 1;
    //④定义静态抽象变量  ？       ×
    //  static abstract int j=1;
    //⑤定义静态的抽象方法【无实现】     ×
    //public static abstract void eat();
    //⑥定义静态的方法【无实现:空代码块】    √
    public static void eat(){};
    //⑤⑥总结：抽象方法/静态方法，方法定义：修饰符 static|abstract 返回值 方法名
    //⑦可以定义内部类：静态内部类      √
    static class Sos{}
    //⑧抽象类有构造器吗？    √
    public Animals() {
    }
    //⑨抽象类普通实现方法？       √
    public void run(){}

}
//⑩抽象类可以继承抽象类吗？          √实现：两个抽象类--形容一个实现
abstract class Thing extends Animals {
    public abstract void sleep();
}
//目的：两个抽象类中所有抽象方法--继承【子】抽象类

//实现类：实现抽象[父]类的方法----多个实现类--继承---抽象
class Person1 extends Animals{ //报错原因：完成重写
    public void say(){
        System.out.println("人---说话~~");
    }
}
public class 抽象类 {
    public static void main (String[] args){
        //抽象类无法创建对象:提供抽象方法--必须由子类实现---多态【造型】
        Animals a=new Person1();
        a.say();//向上造型--重写：抽象【父】类的抽象方法【覆盖】
    }
}
